
#include "main.h"
#include "soft_spi.h"

void SOFT_SPI_Init()
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
	__HAL_RCC_GPIOA_CLK_ENABLE();
	/**SPI1 GPIO Configuration    
	PA5     ------> SPI1_SCK
	PA6     ------> SPI1_MISO
	PA7     ------> SPI1_MOSI 
	*/
	GPIO_InitStruct.Pin = SSPI_SCK_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(SSPI_SCK_GPIO, &GPIO_InitStruct);
 
 	GPIO_InitStruct.Pin = SSPI_MOSI_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(SSPI_MOSI_GPIO, &GPIO_InitStruct);
 
 	GPIO_InitStruct.Pin = SSPI_CS_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(SSPI_CS_GPIO, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = SSPI_MISO_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(SSPI_MISO_GPIO, &GPIO_InitStruct);
	
	//SSPI_CS_LOW;
	SSPI_CS_HIGH;
	SSPI_SCK_HIGH;
	SSPI_MOSI_HIGH;
}

//void SSPI_Delay(void)
//{
//	uint8_t i=1;
//	while(i--);
//}
#define SSPI_Delay() 

void SPI_WriteByte(uint8_t TxData)
{
	uint8_t cnt;
	for(cnt=0;cnt<8;cnt++)
	{
		SSPI_SCK_LOW;
		SSPI_Delay();
		if(TxData&0x80)
		{
			SSPI_MOSI_HIGH;
		}else
		{
			SSPI_MOSI_LOW;
		}
		TxData<<=1;
		SSPI_SCK_HIGH;
		SSPI_Delay();
	}
	SSPI_SCK_LOW;
}

uint8_t SPI_ReadByte(void)
{
	uint8_t cnt,RxData=0;

	SSPI_SCK_LOW;
	for(cnt=0;cnt<8;cnt++)
	{
		SSPI_SCK_HIGH;
		SSPI_Delay();
		RxData <<=1;
		if(SSPI_MISO_READ)
		{
			RxData |= 0x01;
		}
		SSPI_SCK_LOW;
		SSPI_Delay();
	}
	return RxData;
}

//uint8_t SPI_ReadByte(void)
//{
//	uint8_t cnt,RxData=0;

//	for(cnt=0;cnt<8;cnt++)
//	{
//		SSPI_SCK_LOW;
//		SSPI_Delay();
//		RxData <<=1;
//		if(SSPI_MISO_READ)
//		{
//			RxData |= 0x01;
//		}
//		SSPI_SCK_HIGH;
//		SSPI_Delay();
//	}
//	return RxData;
//}



uint8_t SPI_WriteReadByte(uint8_t TxData)
{
	uint8_t cnt,RxData=0;
	for(cnt=0;cnt<8;cnt++)
	{
		SSPI_SCK_LOW;
		SSPI_Delay();
		
		if(TxData&0x80)
		{
			SSPI_MOSI_HIGH;
		}else
		{
			SSPI_MOSI_LOW;
		}
		TxData<<=1;
		
		RxData <<=1;
		if(SSPI_MISO_READ)
		{
			RxData |= 0x01;
		}
		
		SSPI_SCK_HIGH;
		SSPI_Delay();
	}
	return RxData;
}

